from langchain_community.vectorstores import Chroma
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
from langchain_core.prompts.chat import BaseMessagePromptTemplate

from langChain.config import model
from langChain.config import embedding
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder, PromptTemplate, FewShotPromptTemplate

# # 1.简单模板消息
# prompt_template = ChatPromptTemplate.from_template(
#     "给我讲一个关于{content}的{adjective}笑话"
# )
# result = prompt_template.format(content='python', adjective='冷')
# print(f'模板直接调用，返回一个Human消息 ：{result}')
# print('-----------------------------------------------------------------')

# # 2.提示词消息类型，system、system、ai
# prompt_template_1 = ChatPromptTemplate.from_messages([
#     ('system', "你是一个人工智能助手，你的名字是{name}"),
#     ('system', "你好"),
#     ('ai', "我很好，谢谢！"),
#     ('human', "{user_input}"),
# ])
#
# prompt_template_2 = ChatPromptTemplate.from_messages([
#     SystemMessage(content="你是一个人工智能助手，你的名字是{name}"),
#     HumanMessage(content="你好"),
#     AIMessage(content='我很好，谢谢！'),
#     HumanMessage(content="{user_input}"),
# ])
#
# print(f'模板格式化输出 ：{prompt_template_1.format(name="LangChain", user_input="你叫什么名字？")}')
#
# print(f'模板格式化输出 ：{prompt_template_2.format(name="LangChain", user_input="你叫什么名字？")}')
# print('-----------------------------------------------------------------')

# # 3. MessagesPlaceholder 消息占位符，能够后置消息
# prompt_template_3 = ChatPromptTemplate.from_messages([
#     SystemMessage(content="you are a helpful assistant"),
#     MessagesPlaceholder("msg"),
# ])
# prompt_template_4 = ChatPromptTemplate.from_messages([
#     ("system", "you are a helpful assistant"),
#     ("placeholder", "{msg}"),
# ])
#
# result_3 = prompt_template_3.invoke({
#     "msg": [HumanMessage(content="how are you?")]
# })
# result_4 = prompt_template_4.invoke({
#     "msg": [HumanMessage(content="how are you?")]
# })
# print(f'MessagesPlaceholder的使用 ：{result_3}')
# print(f'MessagesPlaceholder的使用 ：{result_4}')
# print('-----------------------------------------------------------------')

# # 提示词示例，用于帮助大模型理解用户意图
examples = [
    {
        "question": "谁的寿命更长，穆罕默德·阿里还是艾伦·图灵？",
        "answer":
            """
            这里需要跟进问题吗：是的。
            跟进：穆罕默德·阿里去世时多大？
            中间答案：穆罕默德·阿里去世时74岁。
            跟进：艾伦·图灵去世时多大？
            中间答案：艾伦·图灵去世时41岁。
            所以最终答案是：穆罕默德·阿里
            """
    },
    {
        "question": "craigslist的创始人是什么时候出生的？",
        "answer":
            """
            这里需要跟进问题吗：是的。
            跟进：craigslist的创始人是谁？
            中间答案：craigslist由Craig Newmark创立。
            跟进：Craig Newmark是什么时候出生的？
            中间答案：Craig Newmark于1952年12月6日出生。
            所以最终答案是：1952年12月6日
            """
    },
    {
        "question": "乔治·华盛顿的祖父母中的母亲是谁？",
        "answer":
            """
            这里需要跟进问题吗：是的。
            跟进：乔治·华盛顿的母亲是谁？
            中间答案：乔治·华盛顿的母亲是Mary Ball Washington。
            跟进：Mary Ball Washington的父亲是谁？
            中间答案：Mary Ball Washington的父亲是Joseph Ball。
            所以最终答案是：Joseph Ball
            """
    },
    {
        "question": "《大白鲨》和《皇家赌场》的导演都来自同一个国家吗？",
        "answer":
            """
            这里需要跟进问题吗：是的。
            跟进：《大白鲨》的导演是谁？
            中间答案：《大白鲨》的导演是Steven Spielberg。
            跟进：Steven Spielberg来自哪里？
            中间答案：美国。
            跟进：《皇家赌场》的导演是谁？
            中间答案：《皇家赌场》的导演是Martin Campbell。
            跟进：Martin Campbell来自哪里？
            中间答案：新西兰。
            所以最终答案是：不是
            """
    }
]
# prompt_template_5 = PromptTemplate(input_variables=["question", "answer"], template="问题：{question} \\{answer}")
#
# # result_5 = prompt_template_5.format(**examples[0])
# # print(f'提示词示例：{result_5}')
#
# # 批量插入示例
# prompt_template_6 = FewShotPromptTemplate(
#     input_variables=["input"],
#     example_prompt=prompt_template_5,
#     examples=examples,
#     suffix="问题：{input}",
#     prefix="请根据问题，给出一个答案。",
#     example_separator="\n\n",
#     validate_template=True,
# )
# result = prompt_template_6.format(input="乔治·华盛顿的父亲是谁？")
# print(f'批量插入示例：{result}')
# print('-----------------------------------------------------------------')

#  ？？？？？？？？？？？？？？？？？？？？？？？？？？？？？？？？？？？？？？？？？？？？？？


# template ：这是一个字符串模板，用于定义如何将输入变量组合成一个完整的提示。例如，如果您的模型需要根据一个人的名字和年龄生成祝福语，您可能会使用一个像 “祝您生日快乐，{name}！您现在 {age} 岁了。” 这样的模板。
#
# examples ：这是一个可选参数，用于提供一组示例，表明如何使用 template 来形成具体的提示。这通常用于帮助理解 template 的用法，或者在某些模型中，这些示例可以直接影响模型的生成结果，因为它给了模型更多的上下文信息。
#
# example_prompt ：这也是一个可选参数，用于定义一个或多个示例提示，这些提示本身是由 PromptTemplate 构造的。换句话说，它是一个或多个 template 的具体实现，用于展示如何根据 template 构建实际的提示。

# # 定义 template
template = "  问题：{question}\n  答案：{answer}"

# 创建 PromptTemplate 实例
prompt_template = PromptTemplate(input_variables=["question", "answer"], template=template)
print(f'模板格式化输出 ：\n{prompt_template.format(question="什么是人工智能？", answer="人工智能就是类人的计算机程序。")}')

examples = [
    {"question": "什么是人工智能？", "answer": "人工智能是模拟人类智能的计算机系统。"},
    {"question": "Python 是什么语言？", "answer": "Python 是一种高级编程语言。"}
]
example_prompt = PromptTemplate(input_variables=["question", "answer"], template="  Q: {question}\n  A: {answer}")
# formatted_example = example_prompt.format( **examples[0])
# print(formatted_example)

prompt_template = PromptTemplate(
    input_variables=["question", "answer"],
    template=template,
    example_prompt=example_prompt,
    examples=examples
)
final_prompt = prompt_template.format(question="什么是人工智能？", answer="人工智能是模拟人类智能的计算机系统。")
print(final_prompt)
